﻿namespace Okazuki.MVVM.PrismSupport.Interactivity
{
    using System;
    using System.Diagnostics;
    using System.Windows;
    using System.Windows.Interactivity;
    using Microsoft.Practices.Prism.Interactivity.InteractionRequest;

    /// <summary>
    /// 指定した型のウィンドウを表示します。
    /// NotificationクラスのTitleプロパティがタイトルに、ContentがDataContextに設定されます。
    /// </summary>
    [DefaultTrigger(typeof(DependencyObject), typeof(InteractionRequestTrigger), null)]
    public class ShowWindowAction : DispatcherTriggerAction
    {
        public static readonly DependencyProperty WindowTypeProperty =
            DependencyProperty.Register(
                "WindowType",
                typeof(Type),
                typeof(ShowWindowAction),
                new PropertyMetadata(typeof(Window)));

        public static readonly DependencyProperty WindowStateProperty =
            DependencyProperty.Register(
                "WindowState", 
                typeof(WindowState), 
                typeof(ShowWindowAction), 
                new PropertyMetadata(WindowState.Normal));

        public static readonly DependencyProperty IsModalWindowProperty =
            DependencyProperty.Register(
                "IsModalWindow", 
                typeof(bool), 
                typeof(ShowWindowAction), 
                new PropertyMetadata(false));

        /// <summary>
        /// 表示するウィンドウのタイプ
        /// </summary>
        public Type WindowType
        {
            get { return (Type)GetValue(WindowTypeProperty); }
            set { SetValue(WindowTypeProperty, value); }
        }

        /// <summary>
        /// 表示するウィンドウのステータス
        /// </summary>
        public WindowState WindowState
        {
            get { return (WindowState)GetValue(WindowStateProperty); }
            set { SetValue(WindowStateProperty, value); }
        }

        /// <summary>
        /// モーダルウィンドウとして表示するかどうか.
        /// このプロパティがtrueでInteractionRequestから渡された型がConfirmationの場合Confirmedプロパティに
        /// ShowDialogの戻り値が格納されます。
        /// </summary>
        public bool IsModalWindow
        {
            get { return (bool)GetValue(IsModalWindowProperty); }
            set { SetValue(IsModalWindowProperty, value); }
        }

        protected override void InvokeAction(InteractionRequestedEventArgs e)
        {
            var w = Activator.CreateInstance(this.WindowType) as Window;
            Debug.WriteLine(w.GetHashCode());
            w.Title = e.Context.Title;
            w.DataContext = e.Context.Content;
            if (this.IsModalWindow)
            {
                var conf = e.Context as Confirmation;
                bool result = w.ShowDialog() ?? false;
                if (conf != null)
                {
                    conf.Confirmed = result;
                }
            }
            else
            {
                w.Show();
            }
            e.Callback();
        }
    }
}
